////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  aecmetering.cpp
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "aecmetering.h"
#include "parametersetmanager.h"

AECMETERING_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Default Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECCoreMeteringTypeClass::AECCoreMeteringTypeClass(
    const CHAR* name)
    : ParameterModule(name, MAJOR, MINOR, PATCH, 0, 0, 0, 0)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(mtrLumaCalc);
    PARAMETER_INITIALIZE(mtrLumaTarget);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECCoreMeteringTypeClass::AECCoreMeteringTypeClass(
    const CHAR* name,
    UINT32 modeId,
    UINT16 mode,
    UINT16 subMode,
    UINT32 group)
    : ParameterModule(name, MAJOR, MINOR, PATCH, modeId, mode, subMode, group)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(mtrLumaCalc);
    PARAMETER_INITIALIZE(mtrLumaTarget);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AECCoreMeteringTypeClass::~AECCoreMeteringTypeClass()
{
    UnloadAECCoreMeteringType(this);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetName
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const CHAR* AECCoreMeteringTypeClass::GetName(
    const CHAR* type)
{
    const CHAR* name = type;
    CHAR temp[ParameterFileSymbolTableEntry::TYPE_LEN + 1];
    if (PARAMETER_STRCMP(type, ParameterFileSymbolTableEntry::GetType(temp, "Metering")) == 0)
    {
        name = "Metering";
    }
    return name;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load EVLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadEVLumaTargetType(
    ParameterFileSymbolTableEntry* entry,
    EVLumaTargetType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->stepsPerEV);
    result = result && entry->ReadInt32(&structure->minEVValue);
    result = result && entry->ReadInt32(&structure->maxEVValue);
    result = result && LoadEVLumaTargetType_EVCompTableStruct(entry, &structure->EVCompTable);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load EVLumaTargetType_EVCompTableStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadEVLumaTargetType_EVCompTableStruct(
    ParameterFileSymbolTableEntry* entry,
    EVLumaTargetType::EVCompTableStruct* structure)
{
    BOOL result = TRUE;
    for (UINT32 i = 0; result && i < 49; i++)
    {
        result = result && entry->ReadFloat(&structure->EVCompTableElements[i]);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ExtrmClrLumaTargetZoneDataType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadExtrmClrLumaTargetZoneDataType(
    ParameterFileSymbolTableEntry* entry,
    ExtrmClrLumaTargetZoneDataType* structure)
{
    BOOL result = TRUE;
    for (UINT32 i = 0; result && i < 3; i++)
    {
        result = result && entry->ReadFloat(&structure->channelAdjRatio[i]);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ExtrmClrLumaTargetZoneType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadExtrmClrLumaTargetZoneType(
    ParameterFileSymbolTableEntry* entry,
    ExtrmClrLumaTargetZoneType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadTriggerPointType(entry, &structure->zoneTrigger);
    result = result && LoadExtrmClrLumaTargetZoneDataType(entry, &structure->zoneData);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ExtrmClrThresRangeType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadExtrmClrThresRangeType(
    ParameterFileSymbolTableEntry* entry,
    ExtrmClrThresRangeType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadFloat(&structure->thres);
    result = result && entry->ReadFloat(&structure->interpPct);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ExtrmClrLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadExtrmClrLumaTargetType(
    ParameterFileSymbolTableEntry* entry,
    ExtrmClrLumaTargetType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableExtrmClr);
    result = result && LoadExtrmClrThresRangeType(entry, &structure->thresRed);
    result = result && LoadExtrmClrThresRangeType(entry, &structure->thresGreenR);
    result = result && LoadExtrmClrThresRangeType(entry, &structure->thresGreenB);
    result = result && LoadExtrmClrThresRangeType(entry, &structure->thresGreenCenter);
    result = result && LoadExtrmClrThresRangeType(entry, &structure->thresBlue);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->thresColorStatsPct);
    result = result && entry->ReadFloat(&structure->thresLumaLow);
    result = result && entry->ReadFloat(&structure->thresLumaHigh);

    // Reading structure->extrmClrLumaTargetZone from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->extrmClrLumaTargetZoneCount);
        structure->extrmClrLumaTargetZoneID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->extrmClrLumaTargetZone   = PARAMETER_NEW ExtrmClrLumaTargetZoneType[structure->extrmClrLumaTargetZoneCount];
        }
        if (!result || structure->extrmClrLumaTargetZone == NULL)
        {
            structure->extrmClrLumaTargetZoneCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->extrmClrLumaTargetZoneCount; i++)
        {
            result = result && LoadExtrmClrLumaTargetZoneType(pointerEntry1, &structure->extrmClrLumaTargetZone[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load HistLumaTargetZoneDataType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadHistLumaTargetZoneDataType(
    ParameterFileSymbolTableEntry* entry,
    HistLumaTargetZoneDataType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadFloat(&structure->minTargetAdjRatio);
    result = result && entry->ReadFloat(&structure->maxTargetAdjRatio);
    result = result && entry->ReadFloat(&structure->satRefLow);
    result = result && entry->ReadFloat(&structure->satRefHigh);
    result = result && entry->ReadFloat(&structure->darkRefLow);
    result = result && entry->ReadFloat(&structure->darkRefHigh);
    for (UINT32 i = 0; result && i < 3; i++)
    {
        result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->histSatPushupRange[i]);
    }
    for (UINT32 i = 0; result && i < 3; i++)
    {
        result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->histSatPushdownRange[i]);
    }
    for (UINT32 i = 0; result && i < 3; i++)
    {
        result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->histDarkRange[i]);
    }
    result = result && entry->ReadFloat(&structure->maxDRCGain);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load HistLumaTargetZoneType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadHistLumaTargetZoneType(
    ParameterFileSymbolTableEntry* entry,
    HistLumaTargetZoneType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadTriggerPointType(entry, &structure->zoneTrigger);
    result = result && LoadHistLumaTargetZoneDataType(entry, &structure->zoneData);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load HistLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadHistLumaTargetType(
    ParameterFileSymbolTableEntry* entry,
    HistLumaTargetType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableHistMetering);
    result = result && entry->ReadBoolean(&structure->enableADRC);
    result = result && entry->ReadBoolean(&structure->enableNonLinearTargetEstimate);
    result = result && entry->ReadBoolean(&structure->enableDarkBoost);
    result = result && entry->ReadBoolean(&structure->enableAntiBandingPrioOverADRC);
    result = result && entry->ReadFloat(&structure->antiBandingPrioTriggerRange);
    result = result && entry->ReadFloat(&structure->targetFilterFactor);

    // Reading structure->histLumaTargetZone from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->histLumaTargetZoneCount);
        structure->histLumaTargetZoneID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->histLumaTargetZone   = PARAMETER_NEW HistLumaTargetZoneType[structure->histLumaTargetZoneCount];
        }
        if (!result || structure->histLumaTargetZone == NULL)
        {
            structure->histLumaTargetZoneCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->histLumaTargetZoneCount; i++)
        {
            result = result && LoadHistLumaTargetZoneType(pointerEntry1, &structure->histLumaTargetZone[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load AECLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadAECLumaTargetType(
    ParameterFileSymbolTableEntry* entry,
    AECLumaTargetType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadLuxLumaTargetType(entry, &structure->luxLumaTarget);
    result = result && LoadHistLumaTargetType(entry, &structure->histLumaTarget);
    result = result && LoadExtrmClrLumaTargetType(entry, &structure->extrmClrLumaTarget);
    result = result && LoadEVLumaTargetType(entry, &structure->EVLumaTarget);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load RgnAdjZoneDataType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadRgnAdjZoneDataType(
    ParameterFileSymbolTableEntry* entry,
    RgnAdjZoneDataType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadTriggerPointType(entry, &structure->thresBrightRgn);
    result = result && aecglobalelements::aecglobalelementsClass::LoadStartEndType(entry, &structure->thresDarkRgn);
    result = result && entry->ReadFloat(&structure->weightBrightRgnAdj);
    result = result && entry->ReadFloat(&structure->weightDarkRgnAdj);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load RgnAdjZoneType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadRgnAdjZoneType(
    ParameterFileSymbolTableEntry* entry,
    RgnAdjZoneType* structure)
{
    BOOL result = TRUE;
    result = result && aecglobalelements::aecglobalelementsClass::LoadTriggerPointType(entry, &structure->zoneTrigger);
    result = result && LoadRgnAdjZoneDataType(entry, &structure->zoneData);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load RgnAdjType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadRgnAdjType(
    ParameterFileSymbolTableEntry* entry,
    RgnAdjType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableBrightRgnAdj);
    result = result && entry->ReadBoolean(&structure->enableDarkRgnAdj);
    result = result && entry->ReadFloat(&structure->minTableWeightForBright);
    result = result && entry->ReadFloat(&structure->maxStatsPctForBright);
    result = result && entry->ReadFloat(&structure->minTableWeightForDark);
    result = result && entry->ReadFloat(&structure->maxStatsPctForDark);

    // Reading structure->rgnAdjZone from the symbol table
    {
        result = result && entry->ReadUInt32(&structure->rgnAdjZoneCount);
        structure->rgnAdjZoneID = entry->ID;
        ParameterFileSymbolTableEntry* pointerEntry1 = entry->Table->ReadPointerEntry(entry);
        result = result && pointerEntry1 != NULL;
        if (result)
        {
            structure->rgnAdjZone   = PARAMETER_NEW RgnAdjZoneType[structure->rgnAdjZoneCount];
        }
        if (!result || structure->rgnAdjZone == NULL)
        {
            structure->rgnAdjZoneCount = 0;
        }
        for (UINT32 i = 0; result && i < structure->rgnAdjZoneCount; i++)
        {
            result = result && LoadRgnAdjZoneType(pointerEntry1, &structure->rgnAdjZone[i]);
        }
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load MtrTableType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadMtrTableType(
    ParameterFileSymbolTableEntry* entry,
    MtrTableType* structure)
{
    BOOL result = TRUE;
    result = result && LoadMtrTableType_centerWeightedStruct(entry, &structure->centerWeighted);
    result = result && LoadMtrTableType_spotWeightedStruct(entry, &structure->spotWeighted);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load MtrTableType_centerWeightedStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadMtrTableType_centerWeightedStruct(
    ParameterFileSymbolTableEntry* entry,
    MtrTableType::centerWeightedStruct* structure)
{
    BOOL result = TRUE;
    for (UINT32 i = 0; result && i < 256; i++)
    {
        result = result && entry->ReadFloat(&structure->weights[i]);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load MtrTableType_spotWeightedStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadMtrTableType_spotWeightedStruct(
    ParameterFileSymbolTableEntry* entry,
    MtrTableType::spotWeightedStruct* structure)
{
    BOOL result = TRUE;
    for (UINT32 i = 0; result && i < 256; i++)
    {
        result = result && entry->ReadFloat(&structure->weights[i]);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load LumaWeightType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadLumaWeightType(
    ParameterFileSymbolTableEntry* entry,
    LumaWeightType* structure)
{
    BOOL result = TRUE;
    for (UINT32 i = 0; result && i < 3; i++)
    {
        result = result && entry->ReadFloat(&structure->weight[i]);
    }
    result = result && entry->ReadBoolean(&structure->enableColorAndSensorComp);
    for (UINT32 i = 0; result && i < 3; i++)
    {
        result = result && entry->ReadFloat(&structure->refGain[i]);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load IndexCalcType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadIndexCalcType(
    ParameterFileSymbolTableEntry* entry,
    IndexCalcType* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadBoolean(&structure->enableLuxIndexComp);
    result = result && entry->ReadFloat(&structure->refSensitivityForExpIndexZero);
    result = result && entry->ReadFloat(&structure->luxIndexFilterFactor);
    structure->bayerGridSubsmplSelect = (aecglobalelements::AECBayerGridSubsmplType)entry->ReadEnum(&result);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load AECLumaCalcType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadAECLumaCalcType(
    ParameterFileSymbolTableEntry* entry,
    AECLumaCalcType* structure)
{
    BOOL result = TRUE;
    result = result && LoadIndexCalcType(entry, &structure->indexCalc);
    result = result && LoadLumaWeightType(entry, &structure->lumaWeight);
    result = result && LoadMtrTableType(entry, &structure->mtrTables);
    result = result && LoadRgnAdjType(entry, &structure->lumaRgnAdj);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load AECCoreMeteringType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::LoadAECCoreMeteringType(
    ParameterFileSymbolTableEntry* entry,
    AECCoreMeteringType* structure)
{
    BOOL result = TRUE;
    result = result && Loadmodule_versionStruct(entry, &structure->module_version);
    result = result && LoadAECLumaCalcType(entry, &structure->mtrLumaCalc);
    result = result && LoadAECLumaTargetType(entry, &structure->mtrLumaTarget);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load module_versionStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL AECCoreMeteringTypeClass::Loadmodule_versionStruct(
    ParameterFileSymbolTableEntry* entry,
    AECCoreMeteringType::module_versionStruct* structure)
{
    BOOL result = TRUE;
    result = result && entry->ReadInt32(&structure->major_revision);
    result = result && entry->ReadInt32(&structure->minor_revision);
    result = result && entry->ReadInt32(&structure->incr_revision);

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ExtrmClrLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreMeteringTypeClass::UnloadExtrmClrLumaTargetType(
    ExtrmClrLumaTargetType* structure)
{
    PARAMETER_DELETE[] structure->extrmClrLumaTargetZone;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload HistLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreMeteringTypeClass::UnloadHistLumaTargetType(
    HistLumaTargetType* structure)
{
    PARAMETER_DELETE[] structure->histLumaTargetZone;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AECLumaTargetType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreMeteringTypeClass::UnloadAECLumaTargetType(
    AECLumaTargetType* structure)
{
    aecglobalelements::aecglobalelementsClass::UnloadLuxLumaTargetType(&structure->luxLumaTarget);
    UnloadHistLumaTargetType(&structure->histLumaTarget);
    UnloadExtrmClrLumaTargetType(&structure->extrmClrLumaTarget);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload RgnAdjType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreMeteringTypeClass::UnloadRgnAdjType(
    RgnAdjType* structure)
{
    PARAMETER_DELETE[] structure->rgnAdjZone;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AECLumaCalcType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreMeteringTypeClass::UnloadAECLumaCalcType(
    AECLumaCalcType* structure)
{
    UnloadRgnAdjType(&structure->lumaRgnAdj);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AECCoreMeteringType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AECCoreMeteringTypeClass::UnloadAECCoreMeteringType(
    AECCoreMeteringType* structure)
{
    UnloadAECLumaCalcType(&structure->mtrLumaCalc);
    UnloadAECLumaTargetType(&structure->mtrLumaTarget);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Parse symbol table entry, and return a new object
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ParameterModule* AECCoreMeteringTypeClass::Parse(
    ParameterSetManager* manager,
    ParameterFileSymbolTableEntry* entry) const
{
    AECCoreMeteringTypeClass* cls = NULL;

    if (PARAMETER_STRCMP(Type, entry->Type) == 0 && Major == entry->Major &&
        Minor == entry->Minor && Patch == entry->Patch)
    {
        cls = PARAMETER_NEW AECCoreMeteringTypeClass(GetName(entry->Type), 
            entry->ModeId, entry->Mode, entry->SubMode, entry->Group);
        if (cls != NULL)
        {
            BOOL result = TRUE;

            cls->SymbolTableID = entry->ID;
            cls->ID            = entry->ID;

            result = result && LoadAECCoreMeteringType(entry, cls);

            if (!result)
            {
                PARAMETER_DELETE cls;
                cls = NULL;
            }
        }
    }
    return (ParameterModule*)cls;
}


AECMETERING_NAMESPACE_END
